#!/usr/bin/python
# -*- coding: utf-8 -*-

import pdb

class DocumentoLatex:
    def __init__(self):
        self.estilos = dict(docPrefaceTitle=self.prefacio, docText=self.texto,
                            docSection1Title=self.seccion, docLink=self.enlace,
                            docList=self.vineta, docSection2Title=self.titulo,
                            docChapterTitle=self.capitulo, pre=self.verbatim,
                            docSidebarTitle=self.titulo, docSection3Title=self.titulo,
                            docFootnote=self.pie_de_pagina, docGlossaryTitle=self.titulo)
        self.archivos_salida = []
        self.salida_actual = open("prueba.tex", "w")
        self.encabezado = self.generar_encabezado("David Ascher, Alex Martelli, Anna Ravenscroft",
        "Python Cookbook, 2nd Edition", "March 2005")

    def generar_encabezado(self, autor, titulo, fecha):
        temp = open("encabezado.tex", "r").read()
        self.encabezado = temp.replace("#titulo", titulo)
        self.encabezado = self.encabezado.replace("#autor", autor)
        self.encabezado = self.encabezado.replace("#fecha", fecha)
        self.salida_actual.write(self.encabezado)

    def pie_de_pagina(self, texto):
        salida = "\\footnote{%s} " % texto
        self.salida_actual.write(salida)

    def titulo(self, texto):
        salida = "\n\n\\textbf{%s}\n\n" % texto
        self.salida_actual.write(salida)

    def verbatim(self, texto):
        salida = "\\begin{verbatim}\n%s\n\\end{verbatim}" % texto
        self.salida_actual.write(salida)

    #def identar(self, texto):
        #salida = "\\indent %s\n\n" % texto
        #self.salida_actual.write(salida)

    #def item_descripcion(self, texto):
        #salida = "\\item[%s] %s\n" % (texto.split(), texto.split())
        #self.salida_actual.write(salida)

    def abrir_vineta(self):
        salida = "\\begin{itemize}\n"
        self.salida_actual.write(salida)

    def cerrar_vineta(self):
        salida = "\\end{itemize}\n"
        self.salida_actual.write(salida)

    def vineta(self, texto):
        salida = "\\item %s\n" % texto
        self.salida_actual.write(salida)

    def escribir(self, estilo):
        func = self.estilos[estilo.estilo]
        if estilo.estilo not in ["pre"]:
            estilo.texto = self.procesar_texto(estilo.texto)
        else:
            estilo.texto = self.procesar_verbatim(estilo.texto)
        func(estilo.texto)

    def prefacio(self, texto):
        salida = "\\chapter*{%s}\n" % texto
        self.salida_actual.write(salida)

    def capitulo(self, texto):
        salida = "\\chapter{%s}\n" % texto.split(". ")[1]
        self.salida_actual.write(salida)

    def texto(self, texto):
        salida = "\n%s\n" % texto
        self.salida_actual.write(salida)

    def finalizar(self):
        salida = "\\end{document}"
        self.salida_actual.write(salida)
        self.salida_actual.close()

    def seccion(self, texto):
        salida = ""
        try:
            salida = "\\section{%s}" % texto.split(". ")[1]
        except IndexError:
            salida = "\\section{%s}" % texto
        self.salida_actual.write(salida)

    def enlace(self, texto):
        salida = "\\textbf{%s} " % texto
        self.salida_actual.write(salida)

    def procesar_texto(self, texto):
        #original = open("prueba.tex", "r").read()
        #modificado = open("modificado.tex", "w")
        # utilizamos listas y no diccionarios porque necesitamos un orden
        # algunos reemplazos tienen mayor prioridad que otros
        busqueda = ["&gt;", "&lt;", "\"", "&nbsp;", "%", "_", "&eacute;", "$", "&", "#", "...", "^"]#, "\\xc3", "\\xa4", "\\xe4"]
        reemplazo = ["*", "*", "''", " ", "\\%", "\\_", "'e'", "\\$", "\\&", "\\#", "\\ldots", " and "]#, "\\\\xc3", "\\\\xa4", "\\\\xe4"]
        for b, r in zip(busqueda, reemplazo):
            texto = texto.replace(b, r)
        return texto
        #modificado.write(original)
        #modificado.close()

    def procesar_verbatim(self, texto):
        busqueda = ["&gt;", "&lt;", "&nbsp;", "&eacute;"]
        reemplazo = [">", "<", " ", "'e'"]
        for b, r in zip(busqueda, reemplazo):
            texto = texto.replace(b, r)
        return texto

    def subseccion(self, texto):
        salida = "\\subsection{%s}" % texto
        self.salida_actual.write(salida)